package com.sen.common.utils.id;

import java.text.DecimalFormat;

import org.apache.commons.lang.StringUtils;

import com.sen.common.utils.SystemParam;

/**
 * 假设在1毫秒内的并发数不超过10000次产生一个String型的多并发的唯一流水号
 * 
 * @author sen
 *
 */
public class CreateIdentityId {
    private static CreateIdentityId creator = new CreateIdentityId();

    private DecimalFormat df = new DecimalFormat("0000");

    private int num = 0;

    /**
     * 获取单例的引用
     * 
     * @return CreateIdentityId
     */
    public static CreateIdentityId getInstance() {
        return creator;
    }
    
    
    /**
     * 产生一个19位的唯一流水号
     * 2位系统编码，13位的毫秒数字，5位的同步递增的序列数
     * 
     * @return String型的流水号
     */
    public String createId() {
        String id = getNum();
        String ret = SystemParam.getCurrentSysId() + System.currentTimeMillis() + id;
        return ret;
    }
    
    /**
     * 产生一个22位的唯一流水号
     * 前面3位操作的编码，第5、6位为系统编码，13位的毫秒数字，5位的同步递增的序列数
     * 
     * @param opCode
     * @return
     */
    public String createId(String opCode) {
    	return StringUtils.trim(opCode) + createId();
    }
    
    private synchronized String getNum() {
        String numStr = "";
        if (num == 10000) {
            num = 0;
        }
        numStr = df.format(num++);

        return numStr;
    }
}
